package samsung.sds.system.common.baseQuery;

import java.lang.reflect.Method;
import java.util.List;

import samsung.sds.system.common.baseQuery.model.PageData;
import samsung.sds.system.common.model.QueryParam;
import samsung.sds.system.utils.CommonTools;
/**
 * 基类Service
 * 提供通用的增删改查及分页方法。
 * 子类需要实现getMapper方法为Service提供Mapper
 * 
 * @author zhouyang wang
 *
 * @param <T> 实体 泛型
 */
public abstract class AbstractBaseService<T> {
	protected abstract BaseMapper<T> getMapper();
	/**
	 * 根据设置的属性值查找实体
	 * @param t
	 * @return
	 * 返回查询结果实体，若查无结果，返回null
	 */
	public T findUniqueByProperty(T t){
		return this.getMapper().findUniqueByProperty(t);
	}
	
	
	/**
	 * 根据ID查找实体
	 * @param ID
	 * @return
	 * 返回查询结果实体，若查无结果，返回null
	 */
	public T findEntityById(String id){
		return this.getMapper().queryEntityById(id);
	}
	 
	
	
	/**
	 * 插入实体
	 * @param t
	 * @return 成功返回1
	 */
	public int insertEntity(T t){
		//add createUser
		try{
			Method setUserMethod = t.getClass().getDeclaredMethod("setCreateUser", java.lang.String.class);
			setUserMethod.invoke(t,CommonTools.getSessionUserName());
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
		//add createTime
		try{
			Method setTimeMethod = t.getClass().getDeclaredMethod("setCreateTime", java.lang.String.class);
			setTimeMethod.invoke(t,CommonTools.getCurrentDateTime());
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
		return this.getMapper().insertEntity(t);
	}

	/**
	 * 更新实体
	 * @param t
	 * @return 成功返回1
	 */
	public int updateEntity(T t){
		//setLast_modify_user
		try{			
			Method setUserMethod = t.getClass().getDeclaredMethod("setLastModifyUser", java.lang.String.class);
			setUserMethod.invoke(t,CommonTools.getSessionUserName());			
		}catch(Exception e){
			e.printStackTrace();
		}		
		
		//setLast_modify_time
		try{
			Method setTimeMethod = t.getClass().getDeclaredMethod("setLastModifyTime", java.lang.String.class);
			setTimeMethod.invoke(t,CommonTools.getCurrentDateTime());	
		}catch(Exception e){
			e.printStackTrace();
		}		
		return this.getMapper().updateEntity(t);
	}
	
	 
	 
	
	/**
	 * 带分页的查询
	 * @param page
	 * @return
	 */
	public PageData<T> queryListPage(QueryParam param) {
		// 规则：Dao层中Mapper接口中需要分页的方法统一定义为以ListPage结尾
		List<T> list = this.getMapper().queryListPage(param);
		PageData<T> pd = new PageData<T>();
		pd.setQueryResult(list);
		pd.setQueryParam(param);
		return pd;
	} 
	
	/**
	 * 不带分页查询
	 * @param param
	 * @return
	 */
	public List<T> queryList(QueryParam param){
		return this.getMapper().queryList(param);
	}
	
	
	 
	public int deleteEntity(T t){
		return this.getMapper().deleteEntity(t);
	}
	
	 
	public int deleteEntityById(String id){
		T t = this.getMapper().queryEntityById(id);
		if(t==null)
			return -1;		
		return this.getMapper().deleteEntity(t);
	}
	
}
